#include "base/Singleton.h"
#include <stdio.h>
#include <pthread.h>  // 用于获取线程ID

namespace cytoolkit {
namespace test {

// 测试1：带有no_destroy的单例（不自动销毁）
class TestNoDestroy : NonCopyable {
public:
    // 标记函数：用于触发 has_no_destroy 检测
    void no_destroy() {}

    TestNoDestroy() {
        // 获取当前线程ID（跨平台兼容写法）
        printf("tid=%lu, constructing TestNoDestroy %p\n", 
               pthread_self(), this);
    }

    ~TestNoDestroy() {
        printf("tid=%lu, destructing TestNoDestroy %p\n", 
               pthread_self(), this);
    }
};

// 测试2：普通单例（自动销毁）
class TestAutoDestroy : NonCopyable {
public:
    TestAutoDestroy() {
        printf("tid=%lu, constructing TestAutoDestroy %p\n", 
               pthread_self(), this);
    }

    ~TestAutoDestroy() {
        printf("tid=%lu, destructing TestAutoDestroy %p\n", 
               pthread_self(), this);
    }
};

}  // namespace test
}  // namespace cytoolkit

int main() {
    using namespace cytoolkit;
    using namespace cytoolkit::test;

    // 测试带no_destroy的单例（不会自动销毁）
    auto& no_destroy_inst = Singleton<TestNoDestroy>::instance();
    (void)no_destroy_inst;  // 避免未使用变量警告
    printf("TestNoDestroy instance: %p\n", &no_destroy_inst);

    // 测试普通单例（会自动销毁）
    auto& auto_destroy_inst = Singleton<TestAutoDestroy>::instance();
    (void)auto_destroy_inst;
    printf("TestAutoDestroy instance: %p\n", &auto_destroy_inst);

    // 提示：TestNoDestroy会内存泄漏（预期行为）
    printf("With valgrind, you should see %zd-byte memory leak (TestNoDestroy).\n",
           sizeof(TestNoDestroy));

    return 0;
}